package br.com.redefranciscanas.wiki.persistence;

import java.util.List;

import javax.persistence.NoResultException;
import javax.persistence.Query;

import br.com.redefranciscanas.wiki.domain.Funcionario;
import br.com.redefranciscanas.wiki.enumerado.NvlAcesso;

public class FuncionarioDao extends Dao {

	public FuncionarioDao() {
		super();
	}

	@SuppressWarnings("unchecked")
	public List<Funcionario> buscaFuncionarios() {
		List<Funcionario> funcionarios;
		Query query = getSession().createNamedQuery("Funcionario.findAll");
		try {
			funcionarios = query.getResultList();
		} catch (NoResultException e) {
			funcionarios = null;
		}
		return funcionarios;
	}

	public Funcionario buscaFuncionarioPeloNome(String nomeUsuario) {
		Funcionario funcionario;
		Query query = getSession().createNamedQuery("Funcionario.findByNomeUsuario");
		query.setParameter("nomeUsuario", nomeUsuario);
		try {
			funcionario = (Funcionario) query.getSingleResult();
		} catch (NoResultException e) {
			funcionario = null;
		}
		return funcionario;
	}

	/**
	 * @see verificaSeHaFuncionarioComNomeUsuario Verifica se há um funcionario no banco de dados com o login, se retornar false, isso quer diser que não há
	 *      funcionario e pode ser inserido no banco
	 */
	public void insere(Funcionario func) {
		if (!verificaSeHaFuncionarioComNomeUsuario(func.getNomeUsuario())) {
			func.setNvlAcesso(NvlAcesso.USUARIO);
			func.setSenha(senhaPadrao());
			try {
				setTransaction(getSession().getTransaction());
				getTransaction().begin();
				getSession().persist(func);
				getTransaction().commit();
				System.out.println("Usuário inserido com sucesso!");
			} catch (Exception e) {
				getTransaction().rollback();
				System.out.println("Erro ao inserir! " + e.getMessage());
			}
		} else {
			System.out.println("Usuário não foi inserido com sucesso!");
		}
	}

	public void atualiza(Funcionario func) {
		try {
			setTransaction(getSession().getTransaction());
			getTransaction().begin();
			getSession().merge(func);
			getTransaction().commit();

		} catch (Exception e) {
			getTransaction().rollback();
			System.out.println("Erro ao atualizar! " + e.getMessage());
		}
	}

	// TODO
	public void deleta(Funcionario funcionario) {
		try {
			setTransaction(getSession().getTransaction());
			getTransaction().begin();
			getSession().remove(funcionario);
			getTransaction().commit();
		} catch (Exception e) {
			getTransaction().rollback();
			System.out.println("Erro ao deletar! " + e.getMessage());
		}
	}

	public boolean verificaSeHaFuncionarioComNomeUsuario(String nomeUsuario) {
		if (buscaFuncionarioPeloNome(nomeUsuario) != null) {
			return true;
		} else {
			return false;
		}
	}

	public String senhaPadrao() {
		String senha = "123Mudar";
		return senha;
	}
}
